在for循环中将两个列从一个文件分隔到两个单独的文件

时间:2016-05-21 06:48:16

标签: linux shell unix scripting

输入文件 list_c ,如下所示:

00000981.ffid   00000982.ffid
00000982.ffid   00000983.ffid
00000983.ffid   00000984.ffid
00000984.ffid   00000985.ffid
00000985.ffid   00000986.ffid
00000986.ffid   00000987.ffid
00000987.ffid   00000988.ffid
00000988.ffid   00000989.ffid
00000989.ffid   00000990.ffid
00000990.ffid   00000991.ffid
00000991.ffid   00000992.ffid
00000992.ffid   00000993.ffid
00000993.ffid   00000994.ffid
00000994.ffid   00000995.ffid
00000995.ffid   00000996.ffid
00000996.ffid   00000997.ffid
00000997.ffid   00000998.ffid
00000998.ffid   00000999.ffid
00000999.ffid   00001000.ffid
00001000.ffid   00001001.ffid
00001001.ffid   00001002.ffid
00001002.ffid   00001003.ffid
00001003.ffid   00001004.ffid
00001004.ffid   00001005.ffid
00001005.ffid   00001006.ffid
00001006.ffid   00001007.ffid
00001007.ffid   

我想将两列分成两个独立的变量,并在循环中使用它们来生成两个输出文件。

我正在使用此代码:

for filename in $(cat /d/home/adira0151/Desktop/tmp/list_c)
do 
    echo "$filename" | awk '{print $1}' >> /d/home/adira0151/Desktop/tmp/C_ffid
    echo "$filename" | awk '{print $2}' >> /d/home/adira0151/Desktop/tmp/N_ffid
done 

但我得到的是 C_ffid

00000981.ffid
00000982.ffid
00000982.ffid
00000983.ffid
00000983.ffid
00000984.ffid
00000984.ffid
00000985.ffid
00000985.ffid
00000986.ffid
00000986.ffid
00000987.ffid
00000987.ffid
00000988.ffid
00000988.ffid
00000989.ffid
00000989.ffid
00000990.ffid
00000990.ffid
00000991.ffid
00000991.ffid
00000992.ffid
00000992.ffid
00000993.ffid
00000993.ffid
00000994.ffid
00000994.ffid
00000995.ffid
00000995.ffid
00000996.ffid
00000996.ffid
00000997.ffid
00000997.ffid
00000998.ffid
00000998.ffid
00000999.ffid
00000999.ffid
00001000.ffid
00001000.ffid
00001001.ffid
00001001.ffid
00001002.ffid
00001002.ffid
00001003.ffid
00001003.ffid
00001004.ffid
00001004.ffid
00001005.ffid
00001005.ffid
00001006.ffid
00001006.ffid
00001007.ffid
00001007.ffid

而另一个文件 N_ffid 是空白的。

请帮忙。

4 个答案:

答案 0 :(得分:1)

将第1列和第2列写入单独的文件:

awk '{print $1>"/path/to/C_ffid"; print $2>"/path/to/N_ffid"}' list_c

如何运作

  • print $1>"/path/to/C_ffid"

    此命令将第一列写入文件/path/to/C_ffid

  • print $2>"/path/to/N_ffid"

    此命令将第二列写入文件/path/to/N_ffid

示例输出

对于输入文件,将创建以下两个输出文件:

$ cat C_ffid 
00000981.ffid
00000982.ffid
00000983.ffid
00000984.ffid
00000985.ffid
00000986.ffid
00000987.ffid
00000988.ffid
00000989.ffid
00000990.ffid
00000991.ffid
00000992.ffid
00000993.ffid
00000994.ffid
00000995.ffid
00000996.ffid
00000997.ffid
00000998.ffid
00000999.ffid
00001000.ffid
00001001.ffid
00001002.ffid
00001003.ffid
00001004.ffid
00001005.ffid
00001006.ffid
00001007.ffid

$ cat N_ffid 
00000982.ffid
00000983.ffid
00000984.ffid
00000985.ffid
00000986.ffid
00000987.ffid
00000988.ffid
00000989.ffid
00000990.ffid
00000991.ffid
00000992.ffid
00000993.ffid
00000994.ffid
00000995.ffid
00000996.ffid
00000997.ffid
00000998.ffid
00000999.ffid
00001000.ffid
00001001.ffid
00001002.ffid
00001003.ffid
00001004.ffid
00001005.ffid
00001006.ffid
00001007.ffid

在shell中循环和处理

while read one two
do
   echo "$one">>C_ffid
   echo "$two">>N_ffid
   echo "Processing $one and $two"
done <list_c

答案 1 :(得分:1)

代码中的问题是,您正在使用awk来打印column1和column2。 awk命令使用space作为列分隔的分隔符。在您的文件中,两列之间有多个空格。因此,只有第二个文件为空。如果你想要它在awk中,改变你的文件,两列之间有一个空格并执行。它也会起作用。

否则,

您可以使用cut命令将其分隔并将其存储到变量中。在开始时,您可以在循环中使用这些变量。

假设两列之间都有选项卡。以下代码将满足您的期望。 var1变量包含第一列值,var2变量包含seconds列值。

var1=`cut -d'     ' -f1 list_c`
var2=`cut -d'     ' -f2 list_c`

for filename in $var1
do 
    echo "$filename" >>C_ffid
done 

for filename in $var2
do 
    echo "$filename" >>C_ffid1
done

但是以任何方式确保在cut命令或awk命令中分隔分隔符。

答案 2 :(得分:0)

POSIX shell脚本,概念上类似于OP的代码, sans awk

cd /d/home/adira0151/Desktop/tmp/
while read a b ; do  
    echo "$a" >> C_ffid
    echo "$b" >> N_ffid
done < list_c

答案 3 :(得分:0)

使用剪切,假设* list_c_ 标签分开:

cd /d/home/adira0151/Desktop/tmp/
cut -f 1 < list_c > C_ffid
cut -f 2 < list_c > N_ffid

如果 space 分开,这将起作用:

tr -s ' ' '\t' < list_c | cut -f 1 > C_ffid
tr -s ' ' '\t' < list_c | cut -f 2 > N_ffid

注意,运行一个输入文件两次是效率低下的,这些将受益于使用并行输入工具,如 pee ,例如:

tr -s ' ' '\t' < list_c | pee "cut -f 1 > C_ffid" "cut -f 2 > N_ffid"

或者,如果标签分开:

pee "cut -f 1 > C_ffid" "cut -f 2 > N_ffid" < list_c
相关问题