
以下は私が達成したいものの例です。
ファイル1:
Adam
John
Tim
ファイル2:
,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801
出力:
Adam,2018-2-1301
Adam,2018-3-1379
Adam,2018-1-3809
Adam,2018-2-5801
John,2018-2-1301
John,2018-3-1379
John,2018-1-3809
John,2018-2-5801
Tim,2018-2-1301
Tim,2018-3-1379
Tim,2018-1-3809
Tim,2018-2-5801
ありがとうございます!
答え1
$ awk 'NR == FNR { names[$1]; next }
{ for (name in names) printf("%s%s\n", name, $0) }' file1 file2
Adam,2018-2-1301
Tim,2018-2-1301
John,2018-2-1301
Adam,2018-3-1379
Tim,2018-3-1379
John,2018-3-1379
Adam,2018-1-3809
Tim,2018-1-3809
John,2018-1-3809
Adam,2018-2-5801
Tim,2018-2-5801
John,2018-2-5801
awk
これは、最初のファイル(3つの名前を持つファイル)を連想配列(キーロ)として読み取るために使用されます。 2 番目のファイルを読み込むと、2 番目のファイルの各行が、前に読み取った各名前とともに繰り返し出力されます。
NR == FNR
最初のファイルから読み取ると、テストは真です。現在のファイルのレコード番号に対して合計レコード番号(「行番号」)をテストします。
また、1つを作ることができますクロスコネクトGNUのようにjoin
:
$ join -j 99 -o1.1,2.1 file[12]
Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801
...99
両方のファイルに存在しないフィールドはどこにありますか?
この例では、結果をパイピングして挿入されたスペースを削除できますtr -d ' '
。
答え2
これはどうですか?
$ cat names
Adam
John
Tim
$ cat dates
,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801
$ while read name; do
while read date; do
n=`echo "$name" | awk '{print $1};'`
d=`echo "$date" | awk '{print $1};'`
echo "$n $d"
done < dates
done < names
Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801
答え3
次のように試すことができます。
awk 'NR==FNR{a[NR]=$0;b=NR;next}{for(i=1;i<=b;i++)print $0 a[i]}' File2 File1